package com.flume.custom;

import java.util.ArrayList;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.PollableSource;
import org.apache.flume.channel.ChannelProcessor;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;

/*
 * 使用flume接收数据，并给每条数据添加前缀，输出到控制台。
 * 前缀可从flume配置文件中配置
 */

public class MySource extends AbstractSource implements Configurable,PollableSource{

	private String prefix;

	// 最核心的方法，在process()中创建event，将event放入channel
	// Status{READY, BACKOFF}
	// READY：source成功的封装了event，存入到channel，返回ready
	// BACKOFF：source无法封装event，无法存入channel，返回backoff
	// process()方法会被PollableSourceRunner线程循环调用
	@Override
	public Status process() throws EventDeliveryException {

		Status status = Status.READY;

		// 封装event
		ArrayList<Event> events = new ArrayList<>();

		for (int i = 0; i < 10; i++) {

			SimpleEvent e = new SimpleEvent();

			// 向body中封装数据
			e.setBody((prefix + "hello" + i).getBytes());

			events.add(e);

		}

		// 将数据放入channel
		try {

			Thread.sleep(5000);

			// 获取当前source对象对应的channelprocessor
			ChannelProcessor cp = getChannelProcessor();

			cp.processEventBatch(events);

		} catch (Exception e) {

			status = Status.BACKOFF;

			e.printStackTrace();

		}

		return status;

	}

	// 当source没有数据可封装时，会让source所在的线程先休息一会，休息的时间，由以下值*计数器系数
	@Override
	public long getBackOffSleepIncrement() {
		return 2000;
	}

	@Override
	public long getMaxBackOffSleepInterval() {
		return 5000;
	}

	// 从配置文件中读取信息
	@Override
	public void configure(Context context) {

		// 从配置文件读取key为prefix的属性值，如果没有配置，默认为mjf:
		prefix = context.getString("prefix", "mjf:");

	}

}
